package com.cloud.school.app.util.mapstruct;

import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.MappingTarget;
import org.mapstruct.Mappings;

import java.util.List;

/**
 * <p>
 *  1:如果对象包含其他对象的集合,在实现转换器时可以使用uses属性指定uses = { 包含对象转换器.class}
 * </p>
 * @ClassName:  IBaseConvertMapper
 * @Description: 实体类与ViewModel数据转换器基类
 * @param <V> ViewModel数据模型对象
 * @param <E> Entity数据模型对象
 */
public interface IBaseConvertMapper<V, E> {

    public static final String COMPONENT_MODEL_SPRING = "spring";

    /**
     * @Title: vmToEntity
     * @Description: 转换ViewModel对象为Entity实体对象
     * @param: v ViewModel对象,如果为null则返回null
     * @return: E Entity实体对象
     */
    @Mappings({})
    public E modelToEntity(V v);

    /**
     * @Title: entityToVM
     * @Description: 转换Entity实体对象为ViewModel对象
     *               <p>
     *               在双向映射的情况下，例如从Entity实体到VMO实体，
     *               一般方法的映射规则是相反的，该注解可以反向切换source和目标
     *               </p>
     * @param: e 实体对象,如果为null则返回null
     * @return: V ViewModel对象
     */
    @InheritInverseConfiguration(name = "modelToEntity")
    public V entityToModel(E entity);

    @Mappings({})
    public void updateEntityToModel(E entity, @MappingTarget V v);

    /**
     * @Title: updateVmToEntity
     * @Description: 根据ViewModel对象属性更新Entity实体对象中相同的属性
     * @param: v ViewModel对象,如果为null则返回null
     * @param: entity Entity实体对象,如果为null则抛出异常
     * @return: void
     */
    @Mappings({})
    public void updateModelToEntity(V v, @MappingTarget E entity);

    /**
     * @Title: entityToVM
     * @Description: 转换Entity实体对象集合为ViewModel对象集合
     * @param: list 实体对象集合
     * @return: List<V> 转换后的ViewModel对象集合
     */
    public List<V> entityToModel(List<E> list);

    /**
     * @Title: vmToEntity
     * @Description: 转换ViewModel实体对象集合为Entity对象集合
     * @param: @param list ViewModel对象集合
     * @return: List<E> 转换后的Entity对象集合
     */
    public List<E> modelToEntity(List<V> list);
}
